package com.shujia.wyh.day12.ketang;

/*
        多态的好处：
            1、提高了程序的维护性(由继承保证)
            2、提高了程序的扩展性(由多态保证)



 */
class Animal{
    public void eat(){
        System.out.println("吃");
    }
    public void sleep(){
        System.out.println("睡");
    }
}

class Dog extends Animal{
    @Override
    public void eat() {
        System.out.println("🐕吃🥩");
    }

    @Override
    public void sleep() {
        System.out.println("🐕趴着睡");
    }
}

class Cat extends Animal{
    @Override
    public void eat() {
        System.out.println("🐱吃🐟");
    }

    @Override
    public void sleep() {
        System.out.println("猫蜷着睡");
    }
}

class Tiger extends Animal{
    @Override
    public void eat() {
        System.out.println("🐅吃牛排");
    }

    @Override
    public void sleep() {
        System.out.println("🐅躺着睡");
    }
}

class AnimalTool{
    //构造方法私有化
    private AnimalTool(){

    }

//    public static void useCat(Cat cat){
//        cat.eat();
//        cat.sleep();
//    }
//
//    public static void useDog(Dog dog){
//        dog.eat();
//        dog.sleep();
//    }
//    public static void useTiger(Tiger tiger){
//        tiger.eat();
//        tiger.sleep();
//    }

    public static void useAnimal(Animal animal){ //Animal animal = new Tiger();
        animal.eat();
        animal.sleep();
    }

}


public class DuoTaiDemo2 {
    public static void main(String[] args) {
        //我喜欢猫，就养了一只猫
        Cat c = new Cat();
//        c.eat();
//        c.sleep();
//        useCat(c);
//        AnimalTool.useCat(c);

        //我很喜欢猫，所以又养了一只
        Cat c2 = new Cat();
//        c.eat();
//        c.sleep();
//        useCat(c2);
//        AnimalTool.useCat(c2);
        //我特别喜欢猫，所以又养了一只
        Cat c3 = new Cat();
//        c3.eat();
//        c3.sleep();
//        useCat(c3);
//        AnimalTool.useCat(c3);
        //...
        //问题：我养了很多只猫，每次创建对象这个我能接收
        //但是呢，调用方法，每次只是对象名不一样，方法都一样，我觉得很麻烦
        //我准备用方法改进

        //现在我不想养猫了，我想养一只狗
        Dog d1 = new Dog();
//        useDog(d1);
//        d1.eat();
//        d1.sleep();
//        AnimalTool.useDog(d1);
        Dog d2 = new Dog();
//        useDog(d2);
//        d2.eat();
//        d2.sleep();
//        AnimalTool.useDog(d2);
        //...养了很多只，同样面临养猫的一个问题，所以我又把狗的吃和睡封装成了一个方法
        //假设，我现在不仅想养猫或者狗，还想大象，老虎，羊驼等等
        //你会发现，每养一次新的动物之后，都会新写一个对应的方法，当我们要养的动物越来越多的时候
        //对应的方法也就越来越多了
        //通过观察，我们可以把这些都是针对于动物操作的方法，放到一个类，这个类专门操作动物的类
        //工具类
        Tiger tiger = new Tiger();
//        AnimalTool.useTiger(tiger);

        //虽然我们使用工具类进行改进，减轻了测试类中的代码量
        //但是，我们之前说过，工具类是不可以随意改动的
        //如果按照现在，每有一个新动物出现，是不是都需要在工具类中加上一个方法
        //有没有什么办法，工具类写完之后，通用到所有的动物呢。
        //怎么改进？使用多态改进
        AnimalTool.useAnimal(tiger);



    }

//    public static void useCat(Cat cat){
//        cat.eat();
//        cat.sleep();
//    }
//
//    public static void useDog(Dog dog){
//        dog.eat();
//        dog.sleep();
//    }

}
